package Point.Double;

import org.junit.Test;

import static MyUtils.MHUtils.*;
import static MyUtils.MHMoban.*;

/*
要矩阵面积最大化:
    距离 越远越好
    最短长度 也要越长越好。
初始很重要：lr分列最左端和最右端,保证距离距离是最远的，
若要下一个矩阵面积比当前面积来得大，必须向内夹，去试！

本题快速解题 靠着：
    1 板子：
        1cur
        迭代
    2 debug
        w2
        nw2
 */
public class 盛水最多的挡板11 {
    @Test
    public void test() {
        int[] a = {1,8,6,2,5,4,8,3,7};
        System.out.println(maxArea(a));
    }
    /*
        双for
     */
    public int maxArea(int[] p) {
        int i=0,n=p.length,j=n-1;
        int max = 0 ;
        while(i<n){
            //i-1cur
            while(j>i) {
                //j-1cur虽然应该放在tv左侧，但是由于不会被改，所以放上面体现[ci]更清楚
                int s = Math.min(p[i], p[j]) * (j - i);
                max = Math.max(s, max);
                int oldj= p[j];
                //j迭代
                while (j > i &&  p[j]<=oldj) {
                    j--;
                }
            }
            //i迭代
            int oldi= p[i];
            while(i<n && p[i]<=oldi){
                i++;
            }
            //j归位
            j=n-1;
        }
        return max;
    }
    //nw/nw2
    public int maxArea_debug(int[] p) {
        int i=0,n=p.length,j=n-1;
        int max = 0 ;
        while(i<n){
            w(String.format("i=%s", i));
            while(j>i) {
                w2(String.format("j=%s", j));
                //1cur虽然应该放在tv左侧，但是由于不会被改，所以放上面体现[ci]更清楚
                int s = Math.min(p[i], p[j]) * (j - i);
                max = Math.max(s, max);
                int oldj= p[j];
                //迭代
                while (j > i &&  p[j]<=oldj) {
                    j--;
                }
                nw2(String.format("j=%s", j));
            }
            int oldi= p[i];
            while(i<n && p[i]<=oldi){
                w2(String.format("i=%s", i));
                i++;
                nw2(String.format("i=%s", i));
            }
            nw(String.format("i=%s", i));
            j=n-1;
        }
        return max;
    }
}
